Árvores de Classificação e Regressão

Classification And Regression Tree (CART) - Breiman et al. (1984)

Deivison Venicio Souza

17/novembro/2018

library(rmarkdown)
knitr::opts_chunk$set(fig.align="center", cache=F, prompt=FALSE, comment = NA, eval = TRUE)

1 Descrição da atividade

Vamos considerar a aplicação de uma árvore de regressão à base de dados abalone, do pacote AppliedPredictiveModeling. Os dados referem-se a 4177 espécimes de abalone, tipo de molusco encontrado ao longo das águas costeiras de todos os continentes. A variável resposta é a idade do molusco, aferida pelo número de anéis internos, que é um procedimento demorado e pouco adequado. O objetivo é ajustar um modelo que permita estimar a idade a partir de outras medidas, que são obtidas com maior facilidade. Para maiores detalhes a respeito da base, consultar a documentação e o link fornecido.

Para a análise, as primeiras 3000 linhas deverão ser usadas para ajuste, e as demais para validação.

  1. Qual o tamanho da árvore (número de nós finais) selecionada por validação cruzada? Quantas são as partições? Nota: Fixe a semente com set.seed(1). Estabeleça cp = 0.001 para o processo de poda.

  2. Quantas covariáveis aparecem no ajuste da árvore?

R: Somente duas covariáveis foram escolhidas pelo algoritmo para ajustar a árvore: ShellWeight e ShuckedWeight.

  1. Qual a idade estimada para moluscos com:
  1. ShellWeight=0.18 e ShuckedWeight=0.25;
  2. ShellWeight=0.31 e ShuckedWeight=0.45?
  1. Qual o resíduo para cada um dos dados? Considere, para o primeiro, Rings=8 e para o segundo Rings=10.

  2. Usando os dados de validação, calcule e apresente o valor da soma de quadrados de resíduos.

2 Carregando pacote

library(AppliedPredictiveModeling)          # contém o conjunto de dados "abalone"
library(PerformanceAnalytics)               # Gráfico da matriz de correlações
library(rpart)                              # Ajustar um modelo de árvore de regressão (CART)
library(rpart.plot)                         # Plotar uma árvore de regressão
library(xlsx)                               # Salvar para excel
library(ggplot2)                            # Vizualização gráfica
library(data.table)                         # manipulação de dados
library(gridExtra)                          # tabela em ggplot2
library(ggthemes)
#library(caret)     

3 Carregando dados e fazendo manipulações

?abalone
data(abalone)                                     # carrega conjunto de dados
str(abalone)                                      # estrutura do data frame
'data.frame':   4177 obs. of  9 variables:
 $ Type         : Factor w/ 3 levels "F","I","M": 3 3 1 3 2 2 1 1 3 1 ...
 $ LongestShell : num  0.455 0.35 0.53 0.44 0.33 0.425 0.53 0.545 0.475 0.55 ...
 $ Diameter     : num  0.365 0.265 0.42 0.365 0.255 0.3 0.415 0.425 0.37 0.44 ...
 $ Height       : num  0.095 0.09 0.135 0.125 0.08 0.095 0.15 0.125 0.125 0.15 ...
 $ WholeWeight  : num  0.514 0.226 0.677 0.516 0.205 ...
 $ ShuckedWeight: num  0.2245 0.0995 0.2565 0.2155 0.0895 ...
 $ VisceraWeight: num  0.101 0.0485 0.1415 0.114 0.0395 ...
 $ ShellWeight  : num  0.15 0.07 0.21 0.155 0.055 0.12 0.33 0.26 0.165 0.32 ...
 $ Rings        : int  15 7 9 10 7 8 20 16 9 19 ...
head(abalone, 10)                                 # ler as primeiras 10 linhas

4 Análise exploratória dos dados

4.1 Distribuição das variáveis

#pairs((abalone[,1:ncol(abalone)]), panel=panel.smooth)
#ggpairs(abalone)
chart.Correlation(abalone[,2:9], histogram=TRUE, pch=19)

ggplot(abalone, aes(x=Type, fill=Type)) + geom_bar() +
    scale_fill_brewer(palette = "Set1")

4.2 Tabelas de frequências

with(abalone,table(Type))     # tabela freq. p/ variável Type
Type
   F    I    M 
1307 1342 1528 

with(abalone,prop.table(table(Type))*100) # tabela freq. (%) p/ variável Type
Type
       F        I        M 
31.29040 32.12832 36.58128 

with(abalone,table(Rings))    # tabela freq. (%) p/ variável Rings (número de anéis)
Rings
  1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18 
  1   1  15  57 115 259 391 568 689 634 487 267 203 126 103  67  58  42 
 19  20  21  22  23  24  25  26  27  29 
 32  26  14   6   9   2   1   1   2   1 

5 Dividindo conjunto de dados: Treino e Teste

Para avaliar a capacidade preditiva do modelo a ser ajustado, a base foi dividida, aleatoriamente, em duas novas bases: a primeira, com 3000 observações, para o ajuste e demais foram deixadas para avaliação do modelo (base de teste).

train <- abalone[1:3000,]
test <- abalone[(nrow(train)+1):nrow(abalone),]

with(train,table(Rings))    # tabela freq. p/ variável Rings (número de anéis)
Rings
  1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18 
  1   1  12  41  87 185 298 406 498 452 315 196 141  91  77  45  47  30 
 19  20  21  22  23  25  26  27  29 
 24  21  12   6   9   1   1   2   1 
with(test,table(Rings))     # tabela freq. p/ variável Rings (número de anéis)
Rings
  3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18  19  20 
  3  16  28  74  93 162 191 182 172  71  62  35  26  22  11  12   8   5 
 21  24 
  2   2 

6 Ajuste do modelo - Árvore de Regressão (Package Rpart) - Implementa o CART

A variável resposta alvo da modelagem será Rings (número de anéis) do molusco. Para se obter a idade do molusco deve-se somar Rings + 1,5. A função rpart tem o seguinte escopo:

rpart(formula, data, weights, subset, na.action = na.rpart, method, model = FALSE, x = FALSE, y = TRUE, parms, control, cost, …)

O parâmetro control recebe uma lista de opções que controlam detalhes do algoritmo rpart. O escopo geral e os parâmetros passíveis de serem controlados estão detalhados abaixo:

rpart.control(minsplit = 20, minbucket = round(minsplit/3), cp = 0.01, maxcompete = 4, maxsurrogate = 5, usesurrogate = 2, xval = 10, surrogatestyle = 0, maxdepth = 30, …)

minsplit = o número mínimo de observações que devem existir em um nó para que uma divisão seja tentada.

minbucket = o número mínimo de observações em qualquer nó terminal . Se apenas um dos minbucket ou minsplit for especificado, o código define minsplit para minbucket*3 ou minbucket para minsplit/3, conforme apropriado.

cp (parâmetro de complexidade) = Qualquer divisão que não diminua a falta total (SSEpai?) de ajuste por um fator de cp não é tentada. Por exemplo, com anova splitting, isso significa que o R-quadrado total deve aumentar em cp em cada etapa. O principal papel desse parâmetro é economizar tempo de computação removendo as divisões que obviamente não valem a pena. Essencialmente, o usuário informa ao programa que qualquer divisão que não melhore o ajuste por cp provavelmente será eliminada por validação cruzada, e que, portanto, o programa não precisa buscá-la.

maxcompete = o número de divisões do concorrente retidas na saída. É útil saber não apenas qual divisão foi escolhida, mas qual variável veio em segundo, terceiro, etc.

maxsurrogate = o número de divisões substitutas retidas na saída. Se isso for definido como zero, o tempo de cálculo será reduzido, uma vez que aproximadamente metade do tempo computacional (diferente de setup) é usado na busca por splits substitutos.

usesurrogate = como usar substitutos no processo de divisão. 0 significa apenas exibição; uma observação com um valor ausente para a regra de divisão primária não é enviada mais abaixo na árvore. 1 significa usar substitutos, em ordem, para dividir os sujeitos que não têm a variável primária; se todos os substitutos estiverem ausentes, a observação não será dividida. Para o valor 2, se todos os substitutos estiverem ausentes, envie a observação na direção majoritária. Um valor de 0 corresponde à ação da árvore e 2 às recomendações de Breiman et.al (1984).

xval = número de validações cruzadas.

surrogatestyle = controla a seleção de um melhor substituto. Se definido como 0 (padrão), o programa usa o número total de classificações corretas para uma variável substituta em potencial, se definida como 1, usa a porcentagem correta, calculada sobre os valores não ausentes do substituto. A primeira opção penaliza mais severamente as covariáveis com um grande número de valores omissos.

maxdepth = Define a profundidade máxima de qualquer nó da árvore final, com o nó raiz contado como profundidade 0. Valores maiores que 30 rpart fornecerão resultados sem sentido em máquinas de 32 bits.

6.1 Usando cp = 1 para ajustar a árvore (sempre resultará em uma árvore sem divisões)

# Um valor de cp = 1 sempre resultará em uma árvore sem divisões
set.seed(1)
(tree.cp1 <- rpart(Rings ~ ., data = train, control = rpart.control(cp = 1)))
n= 3000 

node), split, n, deviance, yval
      * denotes terminal node

1) root 3000 33030.56 9.941 *

6.2 Usando cp = 0.01 (parâmetro default) para ajustar a árvore

# Aqui o valor de cp = 0.01 (padrão)
set.seed(1)
(tree <- rpart(Rings ~ ., data = train, method="anova", control = rpart.control(cp = 0.01)))
n= 3000 

node), split, n, deviance, yval
      * denotes terminal node

 1) root 3000 33030.5600  9.941000  
   2) ShellWeight< 0.19475 1248  6526.1660  7.853365  
     4) ShellWeight< 0.06775 333   874.7988  5.939940 *
     5) ShellWeight>=0.06775 915  3988.4870  8.549727  
      10) ShellWeight< 0.11925 367  1046.7740  7.771117 *
      11) ShellWeight>=0.11925 548  2570.2240  9.071168 *
   3) ShellWeight>=0.19475 1752 17190.9400 11.428080  
     6) ShellWeight< 0.4095 1417 11055.2900 10.956250  
      12) ShuckedWeight>=0.39975 834  4041.4240 10.395680  
        24) ShellWeight< 0.29275 307   705.5179  9.397394 *
        25) ShellWeight>=0.29275 527  2851.7270 10.977230 *
      13) ShuckedWeight< 0.39975 583  6376.8990 11.758150  
        26) ShellWeight< 0.25475 321  2310.4740 10.707170  
          52) ShuckedWeight>=0.2425 271  1280.6350 10.195570 *
          53) ShuckedWeight< 0.2425 50   574.4800 13.480000 *
        27) ShellWeight>=0.25475 262  3277.4500 13.045800 *
     7) ShellWeight>=0.4095 335  4485.8090 13.423880  
      14) ShuckedWeight>=0.589 237  2425.2490 12.497890  
        28) ShellWeight< 0.568 188  1250.3190 11.797870 *
        29) ShellWeight>=0.568 49   729.3469 15.183670 *
      15) ShuckedWeight< 0.589 98  1365.8880 15.663270 *

A função print imprime a árvore construída (neste caso, com os parâmetros de controle padrão). Foram geradas 21 regras (nós), que proporcionaram a criação de 10 divisões e 11 nós terminais (leaf). O simbolo * denota um nó terminal. Somente duas variáveis foram escolhidas pelo algoritmo para trabalhar as divisões: ShellWeight e ShuckedWeight.

print(tree)
n= 3000 

node), split, n, deviance, yval
      * denotes terminal node

 1) root 3000 33030.5600  9.941000  
   2) ShellWeight< 0.19475 1248  6526.1660  7.853365  
     4) ShellWeight< 0.06775 333   874.7988  5.939940 *
     5) ShellWeight>=0.06775 915  3988.4870  8.549727  
      10) ShellWeight< 0.11925 367  1046.7740  7.771117 *
      11) ShellWeight>=0.11925 548  2570.2240  9.071168 *
   3) ShellWeight>=0.19475 1752 17190.9400 11.428080  
     6) ShellWeight< 0.4095 1417 11055.2900 10.956250  
      12) ShuckedWeight>=0.39975 834  4041.4240 10.395680  
        24) ShellWeight< 0.29275 307   705.5179  9.397394 *
        25) ShellWeight>=0.29275 527  2851.7270 10.977230 *
      13) ShuckedWeight< 0.39975 583  6376.8990 11.758150  
        26) ShellWeight< 0.25475 321  2310.4740 10.707170  
          52) ShuckedWeight>=0.2425 271  1280.6350 10.195570 *
          53) ShuckedWeight< 0.2425 50   574.4800 13.480000 *
        27) ShellWeight>=0.25475 262  3277.4500 13.045800 *
     7) ShellWeight>=0.4095 335  4485.8090 13.423880  
      14) ShuckedWeight>=0.589 237  2425.2490 12.497890  
        28) ShellWeight< 0.568 188  1250.3190 11.797870 *
        29) ShellWeight>=0.568 49   729.3469 15.183670 *
      15) ShuckedWeight< 0.589 98  1365.8880 15.663270 *

A função summary fornece um resumo amplo do modelo ajustado. A função também reconhece a opção cp que permite ao usuário imprimir apenas poucas divisões superiores. Pode-se, por exemplo, imprimir apenas divisões com cp superiores à 0.02. Na tabela são informados os valores de CP (parâmetro de complexidade), nsplit (número de divisões), rel error (erro relativo), xerror e xstd (erro padrão obtido com base no conjunto de validação). O score CP é impresso da menor árvore (sem divisões) - que terá o maior CP - para a maior e mais complexa (10 divisões), que terá obviamente o menor CP. O número de nós terminais é sempre 1 + o número de divisões (10), portanto têm-se 11 nós terminais. O rel error (erro relativo) é obtido fazendo-se \(1-R^2\) (coeficiente de determinação), semelhante à regressão linear (parece ser as previsões do modelo sobre o conjunto de treinamento). Do contrário, o xerror está relacionado à estatística PRESS (parece ser o erro do modelo sobre o conjunto de validação). O \(R^2\) é calculado fazendo-se SSR/SST, em que: SSR = soma total do erro (valor previsto - valor médio)^2; e SST = soma total do erro (valor real - valor médio)^2. O \(R^2\) também pode ser calculado por 1-SSE /SST. Em que: SSE = soma total do erro (valor real - valor previsto)^2.

A estatística de soma dos quadrados de erros residuais previstos (PRESS) é uma forma de validação cruzada usada na análise de regressão para fornecer uma medida resumida do ajuste de um modelo a uma amostra de observações que não foram usadas para estimar o modelo. É calculado como as somas de quadrados dos resíduos de previsão para essas observações. Tendo sido produzido um modelo ajustado, cada observação, por sua vez, é removida e o modelo é refeito usando as observações restantes. O valor predito fora da amostra é calculado para a observação omitida em cada caso, e a estatística PRESS é calculada como a soma dos quadrados de todos os erros de previsão resultantes.

Tendo sido produzido um modelo ajustado, cada observação, por sua vez, é removida e o modelo é refeito usando as observações restantes. O valor predito fora da amostra é calculado para a observação omitida em cada caso, e a estatística PRESS é calculada como a soma dos quadrados de todos os erros de previsão resultantes.

Como escolher a melhor árvore?

A convenção é usar a melhor árvore (menor erro de validação cruzada) ou a menor árvore (mais simples) dentro de 1 erro padrão (SE) da melhor árvore (regra 1-SE). A regra 1-SE aconselha a procurar a árvore de erro mínimo, mas depois subir 1-SE na busca de uma árvore menos complexa (mais simples). Asssim, para este problema em específico, inicialmente, encontramos que a divisão nsplits = 10 foi aquela com menor erro na validação (xerror = 0.5677094, com xstd = 0.02477702). Em seguida, fazendo-se o cálculo para a regra 1-SE ter-se-ia: \(0.5677094 + 1*0.02477702 = 0.5924864\). Então, o valor obtido pela regra 1-SE foi 0.5924864. Portanto, a regra 1-SE sugere que uma árvore com 7 divisões (xerror = 0.5826542 é menor que o limiar da regra 1-SE, ou seja, está dentro de 1-SE da melhor árvore) faz efetivamente o mesmo trabalho do que a árvore com 10 divisões (que possui o menor xerror = 0.5677094). Por fim, a árvore com 7 divisões pode ser considerada o modelo mais parcimonioso, cujo erro não é mais do que 1-SE (erro padrão) acima do erro do melhor modelo (árvore com 10 divisões).

A melhoria (CP) é a alteração percentual no SSE (soma de erro quadrático) para essa divisão, ou seja, \(1 - (SS_{right} + SS_{left})/SS_{parent}\), que é o ganho em \(R^2\) para o ajuste. (Fonte: An Introduction to Recursive Partitioning Using the RPART Routines) (Therneau et al., 2018, p.37). Assim, por exemplo, o valor CP = 0.281965 para o nó raiz (sem divisão) é obtido fazendo-se: \(1 - (6526.166 + 17190.94)/33030.56 = 0.281965\). Em que: \(SS_{right}\) = soma de erro quadrático na parte direita da árvore; \(SS_{left}\) = soma de erro quadrático na parte esquerda da árvore; \(SS_{parent}\) = soma de erro quadrático no nó “pai”.

summary(tree, cp = 0.02)      # um resumo da árvore (imprimindo divisões com cp superiores à 0.02)
Call:
rpart(formula = Rings ~ ., data = train, method = "anova", control = rpart.control(cp = 0.01))
  n= 3000 

           CP nsplit rel error    xerror       xstd
1  0.28196475      0 1.0000000 1.0005429 0.03843041
2  0.05034368      1 0.7180352 0.7275070 0.03044610
3  0.04994897      2 0.6676916 0.6829629 0.02903991
4  0.02158515      3 0.6177426 0.6471234 0.02758708
5  0.02103120      5 0.5745723 0.6295624 0.02703700
6  0.01465854      6 0.5535411 0.5990034 0.02605649
7  0.01378599      7 0.5388826 0.5826542 0.02512203
8  0.01349002      8 0.5250966 0.5817429 0.02510887
9  0.01124683      9 0.5116066 0.5771405 0.02495954
10 0.01000000     10 0.5003597 0.5677094 0.02477702

Variable importance
  ShellWeight   WholeWeight      Diameter  LongestShell VisceraWeight 
           21            17            16            15            15 
ShuckedWeight        Height 
           14             1 

Node number 1: 3000 observations,    complexity param=0.2819648
  mean=9.941, MSE=11.01019 
  left son=2 (1248 obs) right son=3 (1752 obs)
  Primary splits:
      ShellWeight   < 0.19475 to the left,  improve=0.2819648, (0 missing)
      Height        < 0.1225  to the left,  improve=0.2545448, (0 missing)
      WholeWeight   < 0.5665  to the left,  improve=0.2490117, (0 missing)
      VisceraWeight < 0.12075 to the left,  improve=0.2484626, (0 missing)
      Diameter      < 0.3475  to the left,  improve=0.2434915, (0 missing)
  Surrogate splits:
      WholeWeight   < 0.65975 to the left,  agree=0.952, adj=0.885, (0 split)
      Diameter      < 0.4025  to the left,  agree=0.939, adj=0.853, (0 split)
      VisceraWeight < 0.14525 to the left,  agree=0.926, adj=0.821, (0 split)
      LongestShell  < 0.5125  to the left,  agree=0.923, adj=0.814, (0 split)
      ShuckedWeight < 0.27125 to the left,  agree=0.908, adj=0.778, (0 split)

Node number 2: 1248 observations,    complexity param=0.05034368
  mean=7.853365, MSE=5.2293 
  left son=4 (333 obs) right son=5 (915 obs)
  Primary splits:
      ShellWeight  < 0.06775 to the left,  improve=0.2548019, (0 missing)
      Diameter     < 0.2425  to the left,  improve=0.2363086, (0 missing)
      WholeWeight  < 0.19675 to the left,  improve=0.2349016, (0 missing)
      Height       < 0.0975  to the left,  improve=0.2327504, (0 missing)
      LongestShell < 0.3425  to the left,  improve=0.2316758, (0 missing)
  Surrogate splits:
      WholeWeight   < 0.20675 to the left,  agree=0.960, adj=0.850, (0 split)
      Diameter      < 0.2725  to the left,  agree=0.952, adj=0.820, (0 split)
      LongestShell  < 0.3525  to the left,  agree=0.943, adj=0.787, (0 split)
      VisceraWeight < 0.04825 to the left,  agree=0.942, adj=0.781, (0 split)
      ShuckedWeight < 0.08525 to the left,  agree=0.936, adj=0.760, (0 split)

Node number 3: 1752 observations,    complexity param=0.04994897
  mean=11.42808, MSE=9.812179 
  left son=6 (1417 obs) right son=7 (335 obs)
  Primary splits:
      ShellWeight   < 0.4095  to the left,  improve=0.09597162, (0 missing)
      Height        < 0.1675  to the left,  improve=0.06080490, (0 missing)
      Diameter      < 0.5125  to the left,  improve=0.03221533, (0 missing)
      WholeWeight   < 1.48025 to the left,  improve=0.03003377, (0 missing)
      ShuckedWeight < 0.28275 to the right, improve=0.01708752, (0 missing)
  Surrogate splits:
      WholeWeight   < 1.444   to the left,  agree=0.916, adj=0.558, (0 split)
      Diameter      < 0.5275  to the left,  agree=0.902, adj=0.487, (0 split)
      LongestShell  < 0.6725  to the left,  agree=0.891, adj=0.430, (0 split)
      VisceraWeight < 0.35775 to the left,  agree=0.880, adj=0.370, (0 split)
      Height        < 0.1875  to the left,  agree=0.874, adj=0.340, (0 split)

Node number 4: 333 observations
  mean=5.93994, MSE=2.627023 

Node number 5: 915 observations
  mean=8.549727, MSE=4.359003 

Node number 6: 1417 observations,    complexity param=0.02158515
  mean=10.95625, MSE=7.801896 
  left son=12 (834 obs) right son=13 (583 obs)
  Primary splits:
      ShuckedWeight < 0.39975 to the right, improve=0.05761623, (0 missing)
      ShellWeight   < 0.25475 to the left,  improve=0.03744456, (0 missing)
      Height        < 0.1625  to the left,  improve=0.02163832, (0 missing)
      Diameter      < 0.4225  to the right, improve=0.02072119, (0 missing)
      LongestShell  < 0.5325  to the right, improve=0.01690833, (0 missing)
  Surrogate splits:
      WholeWeight   < 0.94775 to the right, agree=0.873, adj=0.691, (0 split)
      LongestShell  < 0.5725  to the right, agree=0.829, adj=0.583, (0 split)
      Diameter      < 0.4525  to the right, agree=0.816, adj=0.552, (0 split)
      VisceraWeight < 0.19425 to the right, agree=0.807, adj=0.530, (0 split)
      ShellWeight   < 0.26325 to the right, agree=0.730, adj=0.345, (0 split)

Node number 7: 335 observations,    complexity param=0.0210312
  mean=13.42388, MSE=13.39047 
  left son=14 (237 obs) right son=15 (98 obs)
  Primary splits:
      ShuckedWeight < 0.589   to the right, improve=0.15486000, (0 missing)
      VisceraWeight < 0.29475 to the right, improve=0.08115390, (0 missing)
      Diameter      < 0.4925  to the right, improve=0.07924906, (0 missing)
      ShellWeight   < 0.568   to the left,  improve=0.07889302, (0 missing)
      WholeWeight   < 1.4395  to the right, improve=0.06980644, (0 missing)
  Surrogate splits:
      WholeWeight   < 1.38925 to the right, agree=0.896, adj=0.643, (0 split)
      VisceraWeight < 0.29825 to the right, agree=0.866, adj=0.541, (0 split)
      LongestShell  < 0.6375  to the right, agree=0.833, adj=0.429, (0 split)
      Diameter      < 0.5175  to the right, agree=0.791, adj=0.286, (0 split)
      ShellWeight   < 0.41175 to the right, agree=0.734, adj=0.092, (0 split)

Node number 12: 834 observations
  mean=10.39568, MSE=4.845833 

Node number 13: 583 observations,    complexity param=0.02158515
  mean=11.75815, MSE=10.93808 
  left son=26 (321 obs) right son=27 (262 obs)
  Primary splits:
      ShellWeight   < 0.25475 to the left,  improve=0.12372390, (0 missing)
      WholeWeight   < 0.942   to the left,  improve=0.09615794, (0 missing)
      Height        < 0.1525  to the left,  improve=0.07877211, (0 missing)
      Type          splits as  RLR,         improve=0.05910621, (0 missing)
      ShuckedWeight < 0.2545  to the right, improve=0.03263195, (0 missing)
  Surrogate splits:
      WholeWeight   < 0.84075 to the left,  agree=0.844, adj=0.653, (0 split)
      Diameter      < 0.4425  to the left,  agree=0.710, adj=0.355, (0 split)
      LongestShell  < 0.5525  to the left,  agree=0.703, adj=0.340, (0 split)
      Height        < 0.1575  to the left,  agree=0.702, adj=0.336, (0 split)
      VisceraWeight < 0.19625 to the left,  agree=0.683, adj=0.294, (0 split)

Node number 14: 237 observations
  mean=12.49789, MSE=10.23312 

Node number 15: 98 observations
  mean=15.66327, MSE=13.93763 

Node number 26: 321 observations
  mean=10.70717, MSE=7.197737 

Node number 27: 262 observations
  mean=13.0458, MSE=12.50935 

O pacote rpart.plot permite gerar árvores customizadas a partir de um objeto rpart:

rpart.plot(tree)

heat.tree <- function(tree, low.is.green = FALSE, ...) { # dots args passed to prp
y <- tree$frame$yval
if(low.is.green)
y <- -y
max <- max(y)
min <- min(y)
cols <- rainbow(99, end = .36)[
ifelse(y > y[1], (y-y[1]) * (99-50) / (max-y[1]) + 50,
(y-min) * (50-1) / (y[1]-min) + 1)]
prp(tree, branch.col = cols, box.col = cols, ...)
}

heat.tree(tree, type = 4, varlen = 0, faclen = 0, fallen.leaves = TRUE)

par(mfrow = c(4,3))
for(iframe in 1:nrow(tree$frame)) {
cols <- ifelse(1:nrow(tree$frame) <= iframe, "black", "gray")
prp(tree, col = cols, branch.col = cols, split.col = cols)
}

Usando a função printcp(tree) pode-se obter a tabela custo-complexidade e outras informações adicionais para o modelo ajustado. Em primeiro lugar, a função relata as variáveis atualmente usuadas para a construção da árvore de regressão: ShellWeight e ShuckedWeight. Também é mostrado o erro no nó raiz, isto é, o erro da árvore sem divisões. Tal erro nada mais é do que o MSE, dado por SSE/N. Onde: SSE = soma de erro quadrático e N = número de observações. Neste primeiro momento, o cálculo do SSE é dado pela soma da diferença entre os valores empíricos de Rings e a média aritmética de Rings em todo cojunto de treinamento.

cp <- printcp(tree)         # Tabela de custo-complexidade.

Regression tree:
rpart(formula = Rings ~ ., data = train, method = "anova", control = rpart.control(cp = 0.01))

Variables actually used in tree construction:
[1] ShellWeight   ShuckedWeight

Root node error: 33031/3000 = 11.01

n= 3000 

         CP nsplit rel error  xerror     xstd
1  0.281965      0   1.00000 1.00054 0.038430
2  0.050344      1   0.71804 0.72751 0.030446
3  0.049949      2   0.66769 0.68296 0.029040
4  0.021585      3   0.61774 0.64712 0.027587
5  0.021031      5   0.57457 0.62956 0.027037
6  0.014659      6   0.55354 0.59900 0.026056
7  0.013786      7   0.53888 0.58265 0.025122
8  0.013490      8   0.52510 0.58174 0.025109
9  0.011247      9   0.51161 0.57714 0.024960
10 0.010000     10   0.50036 0.56771 0.024777

rsq.val <- 1-cp[,c(3,4)]    # extrai o Rsquared
#R2 <- 1 - (sum((actual-predict )^2)/sum((actual-mean(actual))^2))

Pode-se plotar o erro de validação cruzada (10 folds) em relação ao parâmetro de complexidade (CP) usando a função plotcp(tree). A função plota no eixo X o parâmetro de complexidade, no eixo Y o erro relativo obtido por validação cruzada e no eixo Z o número de divisões (nsplits) + 1 (estou em dúvida?). As barras verticais representam o resultado da operação (xerror + xstd). Onde: xerror = Erro relativo na validação, xstd = erro padrão na validação. Assim, tem-se que as barras verticais nada mais são do que o erro relativo + 1 desvio padrão, cujos scores são obtidos por meio de valiadação cruzada. A linha pontilhada é o resultado da operação (xerror + xstd) = (0.56771 + 0.024777) = 0.5924864. O valor 0.5924864 é limiar de decisão da regra 1-SE. A idéia é de que árvores menores (menos complexas) que tenham erros de validação (xerror) menor (ou dentro) desse limiar terão desempenho semelhante a árvore com “menor estatística desempenho” na validação cruzada (menor xerror), com a vantagem de ser mais parcimoniosa (mais simples).

# curva custo-complexidade
par(mfrow=c(1,2), mar=c(4,5,5,3)) # mar(bottom, left, top, right)

plotcp(tree, upper = "splits",  minline = TRUE)     # Usando "splits" fica mais fácil ver onde cortar a árvore...          
plotcp(tree, upper = "size",  minline = TRUE)

         1          2          3          4          5          6 
0.28196475 0.05034368 0.04994897 0.02158515 0.02103120 0.01465854 
         7          8          9         10 
0.01378599 0.01349002 0.01124683 0.01000000 
         1          2          3          4          5          6 
       Inf 0.11914337 0.05014593 0.03283528 0.02130637 0.01755810 
         7          8          9         10 
0.01421557 0.01363720 0.01231747 0.01060511 

Podemos obter gráficos do ajuste usando a função rsq.rpart(tree). A primeira figura mostra a relação R-squared (coeficiente de determinação) versus Number of Splits (número de divisões). Nesta figura duas curvas são plotadas indicando o R-squared Relativo e R-squared Apparent. O “rel error” é 1−R2, semelhante a regressão linear (creio que seja o erro nas observações usadas para treinar o modelo?). O “xerror” está relacionado à estatística PRESS. Este é o erro nas observações dos dados de validação cruzada. (Fonte: https://stats.stackexchange.com/questions/103018/difference-between-rel-error-and-xerror-in-rpart-regression-trees).

A segunda figura é equivalente a obtida pela função plotcp(tree), porém sem a linha pontilhada que mostrar o limiar para poda da árvore considerando a regra 1-SE. Anteriormente, observando o gráfico da função plotcp(tree) a sugestão foi que a árvore fosse podada (prune) para incluir apenas 7 divisões.

rsq.rpart(tree)

Regression tree:
rpart(formula = Rings ~ ., data = train, method = "anova", control = rpart.control(cp = 0.01))

Variables actually used in tree construction:
[1] ShellWeight   ShuckedWeight

Root node error: 33031/3000 = 11.01

n= 3000 

         CP nsplit rel error  xerror     xstd
1  0.281965      0   1.00000 1.00054 0.038430
2  0.050344      1   0.71804 0.72751 0.030446
3  0.049949      2   0.66769 0.68296 0.029040
4  0.021585      3   0.61774 0.64712 0.027587
5  0.021031      5   0.57457 0.62956 0.027037
6  0.014659      6   0.55354 0.59900 0.026056
7  0.013786      7   0.53888 0.58265 0.025122
8  0.013490      8   0.52510 0.58174 0.025109
9  0.011247      9   0.51161 0.57714 0.024960
10 0.010000     10   0.50036 0.56771 0.024777

6.3 Usando cp = 0.001 para ajustar a árvore (sugerido na atividade)

# Aqui o valor de cp = 0.001
set.seed(1)
(tree.cp3 <- rpart(Rings ~ ., data = train, method="anova", control = rpart.control(cp = 0.001)))
n= 3000 

node), split, n, deviance, yval
      * denotes terminal node

   1) root 3000 33030.56000  9.941000  
     2) ShellWeight< 0.19475 1248  6526.16600  7.853365  
       4) ShellWeight< 0.06775 333   874.79880  5.939940  
         8) ShellWeight< 0.0265 92   104.95650  4.478261 *
         9) ShellWeight>=0.0265 241   498.24900  6.497925  
          18) Type=F,I 201   277.49250  6.268657 *
          19) Type=M 40   157.10000  7.650000  
            38) Diameter< 0.2425 25    62.00000  6.800000 *
            39) Diameter>=0.2425 15    46.93333  9.066667 *
       5) ShellWeight>=0.06775 915  3988.48700  8.549727  
        10) ShellWeight< 0.11925 367  1046.77400  7.771117  
          20) Type=I 253   526.11070  7.332016 *
          21) Type=F,M 114   363.62280  8.745614 *
        11) ShellWeight>=0.11925 548  2570.22400  9.071168  
          22) ShuckedWeight>=0.22525 288   727.98610  8.506944  
            44) ShellWeight< 0.1595 100   120.75000  7.750000 *
            45) ShellWeight>=0.1595 188   519.46280  8.909574  
              90) Type=I,M 145   325.83450  8.710345 *
              91) Type=F 43   168.46510  9.581395  
               182) ShuckedWeight>=0.26725 27    33.18519  8.740741 *
               183) ShuckedWeight< 0.26725 16    84.00000 11.000000 *
          23) ShuckedWeight< 0.22525 260  1648.99600  9.696154  
            46) ShellWeight< 0.151 161   799.80120  9.161491  
              92) ShuckedWeight>=0.124 153   642.99350  9.006536  
               184) Height< 0.1325 136   470.23530  8.794118  
                 368) Type=I 68   169.69120  8.220588 *
                 369) Type=F,M 68   255.80880  9.367647 *
               185) Height>=0.1325 17   117.52940 10.705880 *
              93) ShuckedWeight< 0.124 8    82.87500 12.125000 *
            47) ShellWeight>=0.151 99   728.32320 10.565660  
              94) WholeWeight< 0.57275 89   534.80900 10.303370  
               188) ShuckedWeight>=0.20925 27    45.62963  9.296296 *
               189) ShuckedWeight< 0.20925 62   449.87100 10.741940 *
              95) WholeWeight>=0.57275 10   132.90000 12.900000 *
     3) ShellWeight>=0.19475 1752 17190.94000 11.428080  
       6) ShellWeight< 0.4095 1417 11055.29000 10.956250  
        12) ShuckedWeight>=0.39975 834  4041.42400 10.395680  
          24) ShellWeight< 0.29275 307   705.51790  9.397394  
            48) ShellWeight< 0.25975 147   154.17690  8.925170 *
            49) ShellWeight>=0.25975 160   488.44370  9.831250  
              98) ShuckedWeight>=0.44525 116   216.86210  9.534483 *
              99) ShuckedWeight< 0.44525 44   234.43180 10.613640  
               198) VisceraWeight< 0.203 22    51.86364  9.772727 *
               199) VisceraWeight>=0.203 22   151.45450 11.454550  
                 398) VisceraWeight>=0.2235 14    37.21429 10.357140 *
                 399) VisceraWeight< 0.2235 8    67.87500 13.375000 *
          25) ShellWeight>=0.29275 527  2851.72700 10.977230  
            50) ShuckedWeight>=0.44425 469  1994.26400 10.739870  
             100) ShellWeight< 0.37725 365  1300.31200 10.550680  
               200) ShuckedWeight>=0.588 129   216.48060 10.108530 *
               201) ShuckedWeight< 0.588 236  1044.82600 10.792370  
                 402) Height< 0.1925 226   834.76550 10.659290 *
                 403) Height>=0.1925 10   115.60000 13.800000 *
             101) ShellWeight>=0.37725 104   635.03850 11.403850  
               202) ShuckedWeight>=0.473 97   428.51550 11.123710 *
               203) ShuckedWeight< 0.473 7    93.42857 15.285710 *
            51) ShuckedWeight< 0.44425 58   617.37930 12.896550  
             102) VisceraWeight>=0.20275 47   346.21280 12.319150 *
             103) VisceraWeight< 0.20275 11   188.54550 15.363640 *
        13) ShuckedWeight< 0.39975 583  6376.89900 11.758150  
          26) ShellWeight< 0.25475 321  2310.47400 10.707170  
            52) ShuckedWeight>=0.2425 271  1280.63500 10.195570  
             104) Height< 0.1525 216   766.55090  9.893519  
               208) ShellWeight< 0.2395 174   489.20110  9.614943  
                 416) ShuckedWeight>=0.304 111   214.97300  9.135135 *
                 417) ShuckedWeight< 0.304 63   203.65080 10.460320  
                   834) WholeWeight< 0.735 54   118.53700 10.092590 *
                   835) WholeWeight>=0.735 9    34.00000 12.666670 *
               209) ShellWeight>=0.2395 42   207.90480 11.047620 *
             105) Height>=0.1525 55   416.98180 11.381820  
               210) LongestShell>=0.5325 29    73.31034 10.241380 *
               211) LongestShell< 0.5325 26   263.88460 12.653850  
                 422) WholeWeight< 0.749 15   101.60000 11.400000 *
                 423) WholeWeight>=0.749 11   106.54550 14.363640 *
            53) ShuckedWeight< 0.2425 50   574.48000 13.480000  
             106) WholeWeight< 0.63925 32   203.50000 12.125000  
               212) Type=I,M 21   106.95240 11.380950 *
               213) Type=F 11    62.72727 13.545450 *
             107) WholeWeight>=0.63925 18   207.77780 15.888890 *
          27) ShellWeight>=0.25475 262  3277.45000 13.045800  
            54) ShellWeight< 0.36425 245  2757.53500 12.783670  
             108) ShuckedWeight>=0.34475 124  1157.19400 11.919350  
               216) WholeWeight< 0.942 68   391.05880 10.882350 *
               217) WholeWeight>=0.942 56   604.21430 13.178570  
                 434) VisceraWeight>=0.187 49   432.00000 12.714290  
                   868) WholeWeight< 1.081 40   317.50000 12.250000  
                    1736) Diameter>=0.4375 33   206.96970 11.696970  
                      3472) VisceraWeight>=0.21525 25    76.00000 11.000000 *
                      3473) VisceraWeight< 0.21525 8    80.87500 13.875000 *
                    1737) Diameter< 0.4375 7    52.85714 14.857140 *
                   869) WholeWeight>=1.081 9    67.55556 14.777780 *
                 435) VisceraWeight< 0.187 7    87.71429 16.428570 *
             109) ShuckedWeight< 0.34475 121  1412.77700 13.669420  
               218) WholeWeight< 0.81 44   527.88640 12.659090  
                 436) Height>=0.1425 29   283.86210 11.931030 *
                 437) Height< 0.1425 15   198.93330 14.066670 *
               219) WholeWeight>=0.81 77   814.31170 14.246750  
                 438) VisceraWeight>=0.16375 62   565.17740 13.693550  
                   876) Diameter>=0.4475 23   133.65220 12.434780 *
                   877) Diameter< 0.4475 39   373.58970 14.435900  
                    1754) WholeWeight< 0.9185 29   287.79310 13.724140  
                      3508) VisceraWeight>=0.1955 10    50.90000 12.100000 *
                      3509) VisceraWeight< 0.1955 19   196.63160 14.578950 *
                    1755) WholeWeight>=0.9185 10    28.50000 16.500000 *
                 439) VisceraWeight< 0.16375 15   151.73330 16.533330 *
            55) ShellWeight>=0.36425 17   260.47060 16.823530 *
       7) ShellWeight>=0.4095 335  4485.80900 13.423880  
        14) ShuckedWeight>=0.589 237  2425.24900 12.497890  
          28) ShellWeight< 0.568 188  1250.31900 11.797870  
            56) ShuckedWeight>=0.70575 116   327.75000 11.250000 *
            57) ShuckedWeight< 0.70575 72   831.65280 12.680560  
             114) WholeWeight< 1.71425 62   424.85480 12.048390  
               228) WholeWeight< 1.552 38   239.26320 11.421050  
                 456) WholeWeight>=1.4285 31   120.19350 10.838710 *
                 457) WholeWeight< 1.4285 7    62.00000 14.000000 *
               229) WholeWeight>=1.552 24   146.95830 13.041670  
                 458) VisceraWeight< 0.3335 7    22.85714 11.142860 *
                 459) VisceraWeight>=0.3335 17    88.47059 13.823530 *
             115) WholeWeight>=1.71425 10   228.40000 16.600000 *
          29) ShellWeight>=0.568 49   729.34690 15.183670  
            58) ShuckedWeight>=0.77 27   237.62960 13.296300 *
            59) ShuckedWeight< 0.77 22   277.50000 17.500000  
             118) LongestShell>=0.6925 14   124.85710 16.285710 *
             119) LongestShell< 0.6925 8    95.87500 19.625000 *
        15) ShuckedWeight< 0.589 98  1365.88800 15.663270  
          30) Diameter>=0.4925 71   741.77460 14.943660  
            60) WholeWeight< 1.35025 33   238.18180 13.545450  
             120) VisceraWeight>=0.25475 23   103.21740 12.652170 *
             121) VisceraWeight< 0.25475 10    74.40000 15.600000 *
            61) WholeWeight>=1.35025 38   383.05260 16.157890  
             122) Height< 0.1975 20   172.95000 15.050000  
               244) Height>=0.1825 11    35.63636 13.818180 *
               245) Height< 0.1825 9   100.22220 16.555560 *
             123) Height>=0.1975 18   158.27780 17.388890 *
          31) Diameter< 0.4925 27   490.66670 17.555560  
            62) WholeWeight< 1.2975 19   368.42110 16.631580 *
            63) WholeWeight>=1.2975 8    67.50000 19.750000 *
# curva custo-complexidade (em função do n. splits)
plotcp(tree.cp3, upper = "splits",  minline = TRUE)
abline(v = 7, lty = "dashed", col = "red")

# curva custo-complexidade (em função de size)
plotcp(tree.cp3, upper = "size",  minline = TRUE)
abline(v = 7, lty = "dashed", col = "red")

6.4 Usando cp = 0 para ajustar a árvore (nenhuma penalidade resulta em uma árvore totalmente adulta)

# Aqui o valor de cp = 0
set.seed(1)
(tree.cp4 <- rpart(Rings ~ ., data = train, method="anova", control = rpart.control(cp = 0)))
n= 3000 

node), split, n, deviance, yval
      * denotes terminal node

     1) root 3000 3.303056e+04  9.941000  
       2) ShellWeight< 0.19475 1248 6.526166e+03  7.853365  
         4) ShellWeight< 0.06775 333 8.747988e+02  5.939940  
           8) ShellWeight< 0.0265 92 1.049565e+02  4.478261  
            16) ShuckedWeight< 0.00725 12 8.916667e+00  3.083333 *
            17) ShuckedWeight>=0.00725 80 6.918750e+01  4.687500  
              34) VisceraWeight< 0.01025 31 2.393548e+01  4.258065  
                68) VisceraWeight>=0.00575 19 6.000000e+00  4.000000 *
                69) VisceraWeight< 0.00575 12 1.466667e+01  4.666667 *
              35) VisceraWeight>=0.01025 49 3.591837e+01  4.959184  
                70) ShuckedWeight>=0.02825 21 1.628571e+01  4.714286  
                 140) LongestShell< 0.2475 7 2.857143e+00  4.142857 *
                 141) LongestShell>=0.2475 14 1.000000e+01  5.000000 *
                71) ShuckedWeight< 0.02825 28 1.742857e+01  5.142857  
                 142) ShellWeight< 0.01875 15 8.400000e+00  4.800000 *
                 143) ShellWeight>=0.01875 13 5.230769e+00  5.538462 *
           9) ShellWeight>=0.0265 241 4.982490e+02  6.497925  
            18) Type=F,I 201 2.774925e+02  6.268657  
              36) VisceraWeight< 0.02975 65 6.301538e+01  5.723077  
                72) ShuckedWeight>=0.041 45 3.097778e+01  5.577778  
                 144) VisceraWeight< 0.025 22 6.772727e+00  5.318182  
                   288) ShellWeight>=0.0305 14 1.714286e+00  5.142857 *
                   289) ShellWeight< 0.0305 8 3.875000e+00  5.625000 *
                 145) VisceraWeight>=0.025 23 2.130435e+01  5.826087  
                   290) Diameter>=0.2325 8 5.875000e+00  5.375000 *
                   291) Diameter< 0.2325 15 1.293333e+01  6.066667 *
                73) ShuckedWeight< 0.041 20 2.895000e+01  6.050000  
                 146) LongestShell< 0.2825 13 1.307692e+01  5.615385 *
                 147) LongestShell>=0.2825 7 8.857143e+00  6.857143 *
              37) VisceraWeight>=0.02975 136 1.858824e+02  6.529412  
                74) ShellWeight< 0.03925 10 2.500000e+00  5.500000 *
                75) ShellWeight>=0.03925 126 1.719444e+02  6.611111  
                 150) ShuckedWeight>=0.07325 83 6.421687e+01  6.325301  
                   300) VisceraWeight< 0.03525 17 1.494118e+01  5.941176 *
                   301) VisceraWeight>=0.03525 66 4.612121e+01  6.424242  
                     602) ShellWeight< 0.05925 30 2.136667e+01  6.233333  
                      1204) ShuckedWeight< 0.08625 16 7.750000e+00  5.875000 *
                      1205) ShuckedWeight>=0.08625 14 9.214286e+00  6.642857 *
                     603) ShellWeight>=0.05925 36 2.275000e+01  6.583333  
                      1206) ShuckedWeight>=0.0955 20 1.175000e+01  6.250000  
                        2412) Height>=0.0875 11 4.909091e+00  5.909091 *
                        2413) Height< 0.0875 9 4.000000e+00  6.666667 *
                      1207) ShuckedWeight< 0.0955 16 6.000000e+00  7.000000 *
                 151) ShuckedWeight< 0.07325 43 8.786047e+01  7.162791  
                   302) ShellWeight< 0.04975 23 2.486957e+01  6.695652  
                     604) ShellWeight>=0.04225 16 7.437500e+00  6.312500 *
                     605) ShellWeight< 0.04225 7 9.714286e+00  7.571429 *
                   303) ShellWeight>=0.04975 20 5.220000e+01  7.700000  
                     606) ShuckedWeight>=0.0645 13 1.676923e+01  7.307692 *
                     607) ShuckedWeight< 0.0645 7 2.971429e+01  8.428571 *
            19) Type=M 40 1.571000e+02  7.650000  
              38) Diameter< 0.2425 25 6.200000e+01  6.800000  
                76) Diameter< 0.2225 14 1.035714e+01  6.214286 *
                77) Diameter>=0.2225 11 4.072727e+01  7.545455 *
              39) Diameter>=0.2425 15 4.693333e+01  9.066667 *
         5) ShellWeight>=0.06775 915 3.988487e+03  8.549727  
          10) ShellWeight< 0.11925 367 1.046774e+03  7.771117  
            20) Type=I 253 5.261107e+02  7.332016  
              40) ShellWeight< 0.11275 221 3.861357e+02  7.221719  
                80) ShuckedWeight>=0.09525 185 2.693838e+02  7.118919  
                 160) ShellWeight< 0.09425 94 9.520213e+01  6.861702  
                   320) VisceraWeight>=0.06025 50 3.488000e+01  6.680000  
                     640) ShuckedWeight>=0.1165 43 2.846512e+01  6.581395  
                      1280) VisceraWeight< 0.0675 26 2.034615e+01  6.423077  
                        2560) LongestShell>=0.3925 17 1.247059e+01  6.176471 *
                        2561) LongestShell< 0.3925 9 4.888889e+00  6.888889 *
                      1281) VisceraWeight>=0.0675 17 6.470588e+00  6.823529 *
                     641) ShuckedWeight< 0.1165 7 3.428571e+00  7.285714 *
                   321) VisceraWeight< 0.06025 44 5.679545e+01  7.068182  
                     642) Diameter< 0.2875 17 1.411765e+01  6.588235 *
                     643) Diameter>=0.2875 27 3.629630e+01  7.370370  
                      1286) LongestShell>=0.3975 11 7.636364e+00  6.818182 *
                      1287) LongestShell< 0.3975 16 2.300000e+01  7.750000 *
                 161) ShellWeight>=0.09425 91 1.615385e+02  7.384615  
                   322) WholeWeight>=0.35775 50 6.298000e+01  6.980000  
                     644) VisceraWeight< 0.09975 43 3.186047e+01  6.837209  
                      1288) ShellWeight< 0.10825 28 1.685714e+01  6.571429  
                        2576) ShuckedWeight< 0.1715 12 5.666667e+00  6.166667 *
                        2577) ShuckedWeight>=0.1715 16 7.750000e+00  6.875000 *
                      1289) ShellWeight>=0.10825 15 9.333333e+00  7.333333 *
                     645) VisceraWeight>=0.09975 7 2.485714e+01  7.857143 *
                   323) WholeWeight< 0.35775 41 8.039024e+01  7.878049  
                     646) VisceraWeight< 0.07775 34 5.944118e+01  7.676471  
                      1292) VisceraWeight>=0.06575 13 6.923077e+00  6.923077 *
                      1293) VisceraWeight< 0.06575 21 4.057143e+01  8.142857  
                        2586) ShuckedWeight< 0.13975 12 1.625000e+01  7.750000 *
                        2587) ShuckedWeight>=0.13975 9 2.000000e+01  8.666667 *
                     647) VisceraWeight>=0.07775 7 1.285714e+01  8.857143 *
                81) ShuckedWeight< 0.09525 36 1.047500e+02  7.750000  
                 162) WholeWeight< 0.2245 23 1.982609e+01  7.086957  
                   324) Height< 0.0975 16 9.750000e+00  6.875000 *
                   325) Height>=0.0975 7 7.714286e+00  7.571429 *
                 163) WholeWeight>=0.2245 13 5.692308e+01  8.923077 *
              41) ShellWeight>=0.11275 32 1.187188e+02  8.093750  
                82) ShuckedWeight>=0.21625 9 4.888889e+00  7.111111 *
                83) ShuckedWeight< 0.21625 23 1.017391e+02  8.478261  
                 166) LongestShell< 0.4475 14 2.892857e+01  8.071429 *
                 167) LongestShell>=0.4475 9 6.688889e+01  9.111111 *
            21) Type=F,M 114 3.636228e+02  8.745614  
              42) ShuckedWeight>=0.128 50 1.240200e+02  8.140000  
                84) Type=M 27 3.066667e+01  7.555556  
                 168) ShellWeight< 0.10125 9 1.288889e+01  7.111111 *
                 169) ShellWeight>=0.10125 18 1.511111e+01  7.777778 *
                85) Type=F 23 7.330435e+01  8.826087  
                 170) LongestShell< 0.4025 8 8.000000e+00  8.000000 *
                 171) LongestShell>=0.4025 15 5.693333e+01  9.266667 *
              43) ShuckedWeight< 0.128 64 2.069375e+02  9.218750  
                86) Diameter< 0.2825 25 7.576000e+01  8.360000  
                 172) VisceraWeight>=0.0475 17 3.411765e+01  7.588235 *
                 173) VisceraWeight< 0.0475 8 1.000000e+01 10.000000 *
                87) Diameter>=0.2825 39 1.009231e+02  9.769231  
                 174) ShellWeight< 0.10275 32 6.400000e+01  9.500000  
                   348) Height< 0.0975 9 9.555556e+00  8.777778 *
                   349) Height>=0.0975 23 4.791304e+01  9.782609  
                     698) Height>=0.1125 7 9.428571e+00  8.714286 *
                     699) Height< 0.1125 16 2.700000e+01 10.250000 *
                 175) ShellWeight>=0.10275 7 2.400000e+01 11.000000 *
          11) ShellWeight>=0.11925 548 2.570224e+03  9.071168  
            22) ShuckedWeight>=0.22525 288 7.279861e+02  8.506944  
              44) ShellWeight< 0.1595 100 1.207500e+02  7.750000  
                88) ShellWeight< 0.1445 51 3.862745e+01  7.450980  
                 176) VisceraWeight< 0.14 41 2.448780e+01  7.292683  
                   352) Height>=0.1075 34 1.826471e+01  7.147059  
                     704) ShellWeight< 0.13125 11 4.545455e+00  6.636364 *
                     705) ShellWeight>=0.13125 23 9.478261e+00  7.391304  
                      1410) WholeWeight>=0.521 16 7.000000e+00  7.250000 *
                      1411) WholeWeight< 0.521 7 1.428571e+00  7.714286 *
                   353) Height< 0.1075 7 2.000000e+00  8.000000 *
                 177) VisceraWeight>=0.14 10 8.900000e+00  8.100000 *
                89) ShellWeight>=0.1445 49 7.281633e+01  8.061224  
                 178) LongestShell>=0.4775 40 5.110000e+01  7.850000  
                   356) Diameter< 0.3925 32 3.121875e+01  7.656250  
                     712) WholeWeight>=0.6005 13 1.430769e+01  7.230769 *
                     713) WholeWeight< 0.6005 19 1.294737e+01  7.947368 *
                   357) Diameter>=0.3925 8 1.387500e+01  8.625000 *
                 179) LongestShell< 0.4775 9 1.200000e+01  9.000000 *
              45) ShellWeight>=0.1595 188 5.194628e+02  8.909574  
                90) Type=I,M 145 3.258345e+02  8.710345  
                 180) VisceraWeight< 0.16075 125 2.092000e+02  8.520000  
                   360) WholeWeight>=0.5935 82 9.297561e+01  8.292683  
                     720) LongestShell< 0.5125 33 2.024242e+01  7.848485  
                      1440) VisceraWeight< 0.14425 26 1.111538e+01  7.730769  
                        2880) Diameter< 0.3825 9 4.222222e+00  7.444444 *
                        2881) Diameter>=0.3825 17 5.764706e+00  7.882353 *
                      1441) VisceraWeight>=0.14425 7 7.428571e+00  8.285714 *
                     721) LongestShell>=0.5125 49 6.183673e+01  8.591837  
                      1442) VisceraWeight>=0.15775 7 4.857143e+00  7.857143 *
                      1443) VisceraWeight< 0.15775 42 5.257143e+01  8.714286  
                        2886) LongestShell< 0.5325 29 2.724138e+01  8.517241  
                          5772) WholeWeight< 0.62825 8 4.000000e+00  8.000000 *
                          5773) WholeWeight>=0.62825 21 2.028571e+01  8.714286  
                           11546) VisceraWeight>=0.13925 11 1.672727e+01  8.454545 *
                           11547) VisceraWeight< 0.13925 10 2.000000e+00  9.000000 *
                        2887) LongestShell>=0.5325 13 2.169231e+01  9.153846 *
                   361) WholeWeight< 0.5935 43 1.039070e+02  8.953488  
                     722) WholeWeight< 0.58075 29 2.124138e+01  8.482759  
                      1444) LongestShell>=0.5025 17 7.764706e+00  8.117647 *
                      1445) LongestShell< 0.5025 12 8.000000e+00  9.000000 *
                     723) WholeWeight>=0.58075 14 6.292857e+01  9.928571 *
                 181) VisceraWeight>=0.16075 20 8.380000e+01  9.900000  
                   362) LongestShell>=0.5175 12 3.491667e+01  8.916667 *
                   363) LongestShell< 0.5175 8 1.987500e+01 11.375000 *
                91) Type=F 43 1.684651e+02  9.581395  
                 182) ShuckedWeight>=0.26725 27 3.318519e+01  8.740741  
                   364) WholeWeight>=0.694 13 4.769231e+00  8.307692 *
                   365) WholeWeight< 0.694 14 2.371429e+01  9.142857 *
                 183) ShuckedWeight< 0.26725 16 8.400000e+01 11.000000 *
            23) ShuckedWeight< 0.22525 260 1.648996e+03  9.696154  
              46) ShellWeight< 0.151 161 7.998012e+02  9.161491  
                92) ShuckedWeight>=0.124 153 6.429935e+02  9.006536  
                 184) Height< 0.1325 136 4.702353e+02  8.794118  
                   368) Type=I 68 1.696912e+02  8.220588  
                     736) VisceraWeight< 0.1125 58 1.099310e+02  8.034483  
                      1472) Diameter>=0.3425 44 5.654545e+01  7.818182  
                        2944) ShellWeight< 0.144 32 2.387500e+01  7.562500  
                          5888) Height>=0.1175 8 6.000000e+00  7.000000 *
                          5889) Height< 0.1175 24 1.450000e+01  7.750000  
                           11778) Diameter< 0.3525 10 6.400000e+00  7.400000 *
                           11779) Diameter>=0.3525 14 6.000000e+00  8.000000 *
                        2945) ShellWeight>=0.144 12 2.500000e+01  8.500000 *
                      1473) Diameter< 0.3425 14 4.485714e+01  8.714286 *
                     737) VisceraWeight>=0.1125 10 4.610000e+01  9.300000 *
                   369) Type=F,M 68 2.558088e+02  9.367647  
                     738) VisceraWeight< 0.1135 58 2.096034e+02  9.155172  
                      1476) ShuckedWeight>=0.16525 35 9.960000e+01  8.800000  
                        2952) WholeWeight< 0.4385 11 1.200000e+01  8.000000 *
                        2953) WholeWeight>=0.4385 24 7.733333e+01  9.166667  
                          5906) Height>=0.1125 17 3.847059e+01  8.823529 *
                          5907) Height< 0.1125 7 3.200000e+01 10.000000 *
                      1477) ShuckedWeight< 0.16525 23 9.886957e+01  9.695652  
                        2954) ShuckedWeight< 0.158 14 3.692857e+01  9.071429 *
                        2955) ShuckedWeight>=0.158 9 4.800000e+01 10.666670 *
                     739) VisceraWeight>=0.1135 10 2.840000e+01 10.600000 *
                 185) Height>=0.1325 17 1.175294e+02 10.705880 *
                93) ShuckedWeight< 0.124 8 8.287500e+01 12.125000 *
              47) ShellWeight>=0.151 99 7.283232e+02 10.565660  
                94) WholeWeight< 0.57275 89 5.348090e+02 10.303370  
                 188) ShuckedWeight>=0.20925 27 4.562963e+01  9.296296  
                   376) Type=I 13 1.123077e+01  8.538462 *
                   377) Type=F,M 14 2.000000e+01 10.000000 *
                 189) ShuckedWeight< 0.20925 62 4.498710e+02 10.741940  
                   378) Type=M 19 2.515789e+01  9.789474 *
                   379) Type=F,I 43 3.998605e+02 11.162790  
                     758) Height>=0.1325 19 8.442105e+01 10.368420 *
                     759) Height< 0.1325 24 2.939583e+02 11.791670  
                      1518) WholeWeight< 0.477 13 1.332308e+02 10.538460 *
                      1519) WholeWeight>=0.477 11 1.161818e+02 13.272730 *
                95) WholeWeight>=0.57275 10 1.329000e+02 12.900000 *
       3) ShellWeight>=0.19475 1752 1.719094e+04 11.428080  
         6) ShellWeight< 0.4095 1417 1.105529e+04 10.956250  
          12) ShuckedWeight>=0.39975 834 4.041424e+03 10.395680  
            24) ShellWeight< 0.29275 307 7.055179e+02  9.397394  
              48) ShellWeight< 0.25975 147 1.541769e+02  8.925170  
                96) LongestShell< 0.5375 16 7.937500e+00  8.437500 *
                97) LongestShell>=0.5375 131 1.419695e+02  8.984733  
                 194) WholeWeight>=0.83175 124 1.366048e+02  8.943548  
                   388) Height>=0.1375 105 9.939048e+01  8.876190  
                     776) ShellWeight< 0.243 58 4.277586e+01  8.672414  
                      1552) WholeWeight>=0.89275 37 2.518919e+01  8.540541  
                        3104) Diameter< 0.4625 26 1.188462e+01  8.346154  
                          6208) VisceraWeight>=0.18625 19 8.526316e+00  8.157895 *
                          6209) VisceraWeight< 0.18625 7 8.571429e-01  8.857143 *
                        3105) Diameter>=0.4625 11 1.000000e+01  9.000000 *
                      1553) WholeWeight< 0.89275 21 1.580952e+01  8.904762  
                        3106) Type=F 9 4.222222e+00  8.444444 *
                        3107) Type=I,M 12 8.250000e+00  9.250000 *
                     777) ShellWeight>=0.243 47 5.123404e+01  9.127660  
                      1554) Height>=0.1475 34 3.297059e+01  8.970588  
                        3108) VisceraWeight< 0.21175 17 1.588235e+01  8.647059 *
                        3109) VisceraWeight>=0.21175 17 1.352941e+01  9.294118 *
                      1555) Height< 0.1475 13 1.523077e+01  9.538462 *
                   389) Height< 0.1375 19 3.410526e+01  9.315789 *
                 195) WholeWeight< 0.83175 7 1.428571e+00  9.714286 *
              49) ShellWeight>=0.25975 160 4.884437e+02  9.831250  
                98) ShuckedWeight>=0.44525 116 2.168621e+02  9.534483  
                 196) VisceraWeight>=0.20625 95 1.648000e+02  9.400000  
                   392) LongestShell< 0.6025 50 7.682000e+01  9.060000  
                     784) VisceraWeight< 0.23125 19 2.073684e+01  8.526316 *
                     785) VisceraWeight>=0.23125 31 4.735484e+01  9.387097  
                      1570) WholeWeight< 1.11175 15 2.200000e+01  9.000000 *
                      1571) WholeWeight>=1.11175 16 2.100000e+01  9.750000 *
                   393) LongestShell>=0.6025 45 7.577778e+01  9.777778  
                     786) LongestShell>=0.6125 29 2.924138e+01  9.482759  
                      1572) Height< 0.1675 20 9.800000e+00  9.100000  
                        3144) Height>=0.1525 10 5.600000e+00  8.800000 *
                        3145) Height< 0.1525 10 2.400000e+00  9.400000 *
                      1573) Height>=0.1675 9 1.000000e+01 10.333330 *
                     787) LongestShell< 0.6125 16 3.943750e+01 10.312500 *
                 197) VisceraWeight< 0.20625 21 4.257143e+01 10.142860  
                   394) ShuckedWeight>=0.4865 9 8.222222e+00  9.444444 *
                   395) ShuckedWeight< 0.4865 12 2.666667e+01 10.666670 *
                99) ShuckedWeight< 0.44525 44 2.344318e+02 10.613640  
                 198) VisceraWeight< 0.203 22 5.186364e+01  9.772727  
                   396) ShellWeight>=0.26025 15 1.493333e+01  9.266667 *
                   397) ShellWeight< 0.26025 7 2.485714e+01 10.857140 *
                 199) VisceraWeight>=0.203 22 1.514545e+02 11.454550  
                   398) VisceraWeight>=0.2235 14 3.721429e+01 10.357140 *
                   399) VisceraWeight< 0.2235 8 6.787500e+01 13.375000 *
            25) ShellWeight>=0.29275 527 2.851727e+03 10.977230  
              50) ShuckedWeight>=0.44425 469 1.994264e+03 10.739870  
               100) ShellWeight< 0.37725 365 1.300312e+03 10.550680  
                 200) ShuckedWeight>=0.588 129 2.164806e+02 10.108530  
                   400) WholeWeight< 1.4875 116 1.839655e+02 10.017240  
                     800) ShellWeight< 0.36175 91 1.396703e+02  9.879121  
                      1600) ShellWeight>=0.3095 78 1.123718e+02  9.756410  
                        3200) ShuckedWeight< 0.642 47 6.948936e+01  9.574468  
                          6400) VisceraWeight< 0.30475 34 5.002941e+01  9.382353  
                           12800) Diameter< 0.49 10 1.410000e+01  8.700000 *
                           12801) Diameter>=0.49 24 2.933333e+01  9.666667  
                             25602) ShellWeight>=0.33 13 1.276923e+01  9.307692 *
                             25603) ShellWeight< 0.33 11 1.290909e+01 10.090910 *
                          6401) VisceraWeight>=0.30475 13 1.492308e+01 10.076920 *
                        3201) ShuckedWeight>=0.642 31 3.896774e+01 10.032260  
                          6402) ShuckedWeight>=0.665 23 2.643478e+01  9.739130  
                           12804) VisceraWeight>=0.30225 7 6.857143e+00  9.142857 *
                           12805) VisceraWeight< 0.30225 16 1.600000e+01 10.000000 *
                          6403) ShuckedWeight< 0.665 8 4.875000e+00 10.875000 *
                      1601) ShellWeight< 0.3095 13 1.907692e+01 10.615380 *
                     801) ShellWeight>=0.36175 25 3.624000e+01 10.520000  
                      1602) LongestShell>=0.6425 13 8.923077e+00 10.076920 *
                      1603) LongestShell< 0.6425 12 2.200000e+01 11.000000 *
                   401) WholeWeight>=1.4875 13 2.292308e+01 10.923080 *
                 201) ShuckedWeight< 0.588 236 1.044826e+03 10.792370  
                   402) Height< 0.1925 226 8.347655e+02 10.659290  
                     804) Diameter< 0.5125 201 6.280995e+02 10.527360  
                      1608) Height< 0.1725 142 3.506831e+02 10.359150  
                        3216) ShellWeight< 0.33475 99 1.879596e+02 10.202020  
                          6432) LongestShell>=0.6375 13 8.769231e+00  9.307692 *
                          6433) LongestShell< 0.6375 86 1.672209e+02 10.337210  
                           12866) VisceraWeight< 0.304 78 1.238462e+02 10.230770  
                             25732) VisceraWeight>=0.22775 58 7.993103e+01 10.034480  
                               51464) ShellWeight>=0.30875 35 4.468571e+01  9.742857  
                                102928) Height>=0.1525 27 2.274074e+01  9.518519  
                                  205856) LongestShell< 0.5975 8 4.000000e+00  9.000000 *
                                  205857) LongestShell>=0.5975 19 1.568421e+01  9.736842 *
                                102929) Height< 0.1525 8 1.600000e+01 10.500000 *
                               51465) ShellWeight< 0.30875 23 2.773913e+01 10.478260  
                                102930) Type=M 10 3.600000e+00  9.800000 *
                                102931) Type=F,I 13 1.600000e+01 11.000000 *
                             25733) VisceraWeight< 0.22775 20 3.520000e+01 10.800000  
                               51466) LongestShell< 0.5875 7 1.942857e+01 10.285710 *
                               51467) LongestShell>=0.5875 13 1.292308e+01 11.076920 *
                           12867) VisceraWeight>=0.304 8 3.387500e+01 11.375000 *
                        3217) ShellWeight>=0.33475 43 1.546512e+02 10.720930  
                          6434) ShellWeight>=0.34525 23 5.060870e+01 10.130430  
                           12868) LongestShell< 0.6375 14 1.742857e+01  9.428571 *
                           12869) LongestShell>=0.6375 9 1.555556e+01 11.222220 *
                          6435) ShellWeight< 0.34525 20 8.680000e+01 11.400000  
                           12870) Height< 0.1625 12 4.266667e+01 10.666670 *
                           12871) Height>=0.1625 8 2.800000e+01 12.500000 *
                      1609) Height>=0.1725 59 2.637288e+02 10.932200  
                        3218) ShuckedWeight< 0.476 13 4.000000e+01 10.000000 *
                        3219) ShuckedWeight>=0.476 46 2.092391e+02 11.195650  
                          6438) ShuckedWeight>=0.51675 29 6.455172e+01 10.655170  
                           12876) WholeWeight>=1.2485 12 3.491667e+01 10.083330 *
                           12877) WholeWeight< 1.2485 17 2.294118e+01 11.058820 *
                          6439) ShuckedWeight< 0.51675 17 1.217647e+02 12.117650 *
                     805) Diameter>=0.5125 25 1.750400e+02 11.720000  
                      1610) WholeWeight< 1.23975 11 5.090909e+01 10.909090 *
                      1611) WholeWeight>=1.23975 14 1.112143e+02 12.357140 *
                   403) Height>=0.1925 10 1.156000e+02 13.800000 *
               101) ShellWeight>=0.37725 104 6.350385e+02 11.403850  
                 202) ShuckedWeight>=0.473 97 4.285155e+02 11.123710  
                   404) LongestShell>=0.6475 53 9.354717e+01 10.679250  
                     808) VisceraWeight< 0.39225 45 6.911111e+01 10.555560  
                      1616) ShellWeight< 0.39175 13 7.692308e+00  9.846154 *
                      1617) ShellWeight>=0.39175 32 5.221875e+01 10.843750  
                        3234) ShellWeight>=0.39575 23 2.173913e+01 10.478260  
                          6468) LongestShell>=0.6725 8 8.000000e+00 10.000000 *
                          6469) LongestShell< 0.6725 15 1.093333e+01 10.733330 *
                        3235) ShellWeight< 0.39575 9 1.955556e+01 11.777780 *
                     809) VisceraWeight>=0.39225 8 1.987500e+01 11.375000 *
                   405) LongestShell< 0.6475 44 3.118864e+02 11.659090  
                     810) WholeWeight< 1.47425 35 1.826857e+02 11.257140  
                      1620) WholeWeight>=1.352 14 1.035714e+01 10.214290 *
                      1621) WholeWeight< 1.352 21 1.469524e+02 11.952380  
                        3242) ShellWeight< 0.38925 9 2.088889e+01 11.111110 *
                        3243) ShellWeight>=0.38925 12 1.149167e+02 12.583330 *
                     811) WholeWeight>=1.47425 9 1.015556e+02 13.222220 *
                 203) ShuckedWeight< 0.473 7 9.342857e+01 15.285710 *
              51) ShuckedWeight< 0.44425 58 6.173793e+02 12.896550  
               102) VisceraWeight>=0.20275 47 3.462128e+02 12.319150  
                 204) Diameter< 0.4625 12 7.000000e+01 11.000000 *
                 205) Diameter>=0.4625 35 2.481714e+02 12.771430  
                   410) LongestShell>=0.6025 23 1.738261e+02 12.086960  
                     820) ShellWeight>=0.321 15 9.360000e+01 11.600000 *
                     821) ShellWeight< 0.321 8 7.000000e+01 13.000000 *
                   411) LongestShell< 0.6025 12 4.291667e+01 14.083330 *
               103) VisceraWeight< 0.20275 11 1.885455e+02 15.363640 *
          13) ShuckedWeight< 0.39975 583 6.376899e+03 11.758150  
            26) ShellWeight< 0.25475 321 2.310474e+03 10.707170  
              52) ShuckedWeight>=0.2425 271 1.280635e+03 10.195570  
               104) Height< 0.1525 216 7.665509e+02  9.893519  
                 208) ShellWeight< 0.2395 174 4.892011e+02  9.614943  
                   416) ShuckedWeight>=0.304 111 2.149730e+02  9.135135  
                     832) WholeWeight< 0.80425 81 1.132099e+02  8.901235  
                      1664) ShuckedWeight>=0.33725 44 4.443182e+01  8.613636  
                        3328) LongestShell< 0.5675 36 3.088889e+01  8.444444  
                          6656) ShuckedWeight< 0.346 7 4.857143e+00  7.857143 *
                          6657) ShuckedWeight>=0.346 29 2.303448e+01  8.586207  
                           13314) ShuckedWeight>=0.36275 12 1.225000e+01  8.250000 *
                           13315) ShuckedWeight< 0.36275 17 8.470588e+00  8.823529 *
                        3329) LongestShell>=0.5675 8 7.875000e+00  9.375000 *
                      1665) ShuckedWeight< 0.33725 37 6.081081e+01  9.243243  
                        3330) Type=F 15 1.093333e+01  8.733333 *
                        3331) Type=I,M 22 4.331818e+01  9.590909  
                          6662) LongestShell>=0.535 11 2.909091e+00  9.090909 *
                          6663) LongestShell< 0.535 11 3.490909e+01 10.090910 *
                     833) WholeWeight>=0.80425 30 8.536667e+01  9.766667  
                      1666) Diameter>=0.4225 22 4.931818e+01  9.409091  
                        3332) Diameter< 0.4425 14 1.692857e+01  8.928571 *
                        3333) Diameter>=0.4425 8 2.350000e+01 10.250000 *
                      1667) Diameter< 0.4225 8 2.550000e+01 10.750000 *
                   417) ShuckedWeight< 0.304 63 2.036508e+02 10.460320  
                     834) WholeWeight< 0.735 54 1.185370e+02 10.092590  
                      1668) Diameter>=0.4175 21 1.257143e+01  9.142857  
                        3336) Diameter>=0.4225 14 8.000000e+00  9.000000 *
                        3337) Diameter< 0.4225 7 3.714286e+00  9.428571 *
                      1669) Diameter< 0.4175 33 7.496970e+01 10.696970  
                        3338) Height< 0.1425 24 4.562500e+01 10.375000  
                          6676) WholeWeight>=0.62 16 2.293750e+01 10.062500 *
                          6677) WholeWeight< 0.62 8 1.800000e+01 11.000000 *
                        3339) Height>=0.1425 9 2.022222e+01 11.555560 *
                     835) WholeWeight>=0.735 9 3.400000e+01 12.666670 *
                 209) ShellWeight>=0.2395 42 2.079048e+02 11.047620  
                   418) VisceraWeight< 0.1525 11 1.363636e+01  9.818182 *
                   419) VisceraWeight>=0.1525 31 1.717419e+02 11.483870  
                     838) LongestShell>=0.5725 11 6.963636e+01 10.181820 *
                     839) LongestShell< 0.5725 20 7.320000e+01 12.200000  
                      1678) VisceraWeight< 0.18975 13 3.107692e+01 11.615380 *
                      1679) VisceraWeight>=0.18975 7 2.942857e+01 13.285710 *
               105) Height>=0.1525 55 4.169818e+02 11.381820  
                 210) LongestShell>=0.5325 29 7.331034e+01 10.241380  
                   420) VisceraWeight>=0.1745 19 3.042105e+01  9.631579 *
                   421) VisceraWeight< 0.1745 10 2.240000e+01 11.400000 *
                 211) LongestShell< 0.5325 26 2.638846e+02 12.653850  
                   422) WholeWeight< 0.749 15 1.016000e+02 11.400000 *
                   423) WholeWeight>=0.749 11 1.065455e+02 14.363640 *
              53) ShuckedWeight< 0.2425 50 5.744800e+02 13.480000  
               106) WholeWeight< 0.63925 32 2.035000e+02 12.125000  
                 212) Type=I,M 21 1.069524e+02 11.380950  
                   424) WholeWeight< 0.608 13 5.723077e+01 10.461540 *
                   425) WholeWeight>=0.608 8 2.087500e+01 12.875000 *
                 213) Type=F 11 6.272727e+01 13.545450 *
               107) WholeWeight>=0.63925 18 2.077778e+02 15.888890 *
            27) ShellWeight>=0.25475 262 3.277450e+03 13.045800  
              54) ShellWeight< 0.36425 245 2.757535e+03 12.783670  
               108) ShuckedWeight>=0.34475 124 1.157194e+03 11.919350  
                 216) WholeWeight< 0.942 68 3.910588e+02 10.882350  
                   432) ShellWeight< 0.2925 52 2.229808e+02 10.519230  
                     864) Height>=0.1375 39 1.407692e+02 10.076920  
                      1728) ShellWeight>=0.26075 32 5.550000e+01  9.625000  
                        3456) ShellWeight>=0.282 11 2.090909e+01  9.090909 *
                        3457) ShellWeight< 0.282 21 2.980952e+01  9.904762  
                          6914) ShellWeight< 0.27575 13 9.230769e+00  9.461538 *
                          6915) ShellWeight>=0.27575 8 1.387500e+01 10.625000 *
                      1729) ShellWeight< 0.26075 7 4.885714e+01 12.142860 *
                     865) Height< 0.1375 13 5.169231e+01 11.846150 *
                   433) ShellWeight>=0.2925 16 1.389375e+02 12.062500 *
                 217) WholeWeight>=0.942 56 6.042143e+02 13.178570  
                   434) VisceraWeight>=0.187 49 4.320000e+02 12.714290  
                     868) WholeWeight< 1.081 40 3.175000e+02 12.250000  
                      1736) Diameter>=0.4375 33 2.069697e+02 11.696970  
                        3472) VisceraWeight>=0.21525 25 7.600000e+01 11.000000  
                          6944) WholeWeight< 0.99075 12 1.691667e+01 10.083330 *
                          6945) WholeWeight>=0.99075 13 3.969231e+01 11.846150 *
                        3473) VisceraWeight< 0.21525 8 8.087500e+01 13.875000 *
                      1737) Diameter< 0.4375 7 5.285714e+01 14.857140 *
                     869) WholeWeight>=1.081 9 6.755556e+01 14.777780 *
                   435) VisceraWeight< 0.187 7 8.771429e+01 16.428570 *
               109) ShuckedWeight< 0.34475 121 1.412777e+03 13.669420  
                 218) WholeWeight< 0.81 44 5.278864e+02 12.659090  
                   436) Height>=0.1425 29 2.838621e+02 11.931030  
                     872) ShuckedWeight>=0.27175 16 9.093750e+01 11.062500 *
                     873) ShuckedWeight< 0.27175 13 1.660000e+02 13.000000 *
                   437) Height< 0.1425 15 1.989333e+02 14.066670 *
                 219) WholeWeight>=0.81 77 8.143117e+02 14.246750  
                   438) VisceraWeight>=0.16375 62 5.651774e+02 13.693550  
                     876) Diameter>=0.4475 23 1.336522e+02 12.434780  
                      1752) WholeWeight< 0.90025 10 3.810000e+01 11.300000 *
                      1753) WholeWeight>=0.90025 13 7.276923e+01 13.307690 *
                     877) Diameter< 0.4475 39 3.735897e+02 14.435900  
                      1754) WholeWeight< 0.9185 29 2.877931e+02 13.724140  
                        3508) VisceraWeight>=0.1955 10 5.090000e+01 12.100000 *
                        3509) VisceraWeight< 0.1955 19 1.966316e+02 14.578950 *
                      1755) WholeWeight>=0.9185 10 2.850000e+01 16.500000 *
                   439) VisceraWeight< 0.16375 15 1.517333e+02 16.533330 *
              55) ShellWeight>=0.36425 17 2.604706e+02 16.823530 *
         7) ShellWeight>=0.4095 335 4.485809e+03 13.423880  
          14) ShuckedWeight>=0.589 237 2.425249e+03 12.497890  
            28) ShellWeight< 0.568 188 1.250319e+03 11.797870  
              56) ShuckedWeight>=0.70575 116 3.277500e+02 11.250000  
               112) ShellWeight< 0.45025 34 3.450000e+01 10.500000  
                 224) LongestShell>=0.6825 20 1.655000e+01 10.150000  
                   448) LongestShell< 0.7025 8 6.000000e+00  9.500000 *
                   449) LongestShell>=0.7025 12 4.916667e+00 10.583330 *
                 225) LongestShell< 0.6825 14 1.200000e+01 11.000000 *
               113) ShellWeight>=0.45025 82 2.661951e+02 11.560980  
                 226) LongestShell>=0.6975 50 7.200000e+01 11.200000  
                   452) Diameter< 0.5725 34 5.073529e+01 10.911760  
                     904) WholeWeight>=2.17025 7 4.857143e+00 10.142860 *
                     905) WholeWeight< 2.17025 27 4.066667e+01 11.111110  
                      1810) WholeWeight< 2.077 20 2.375000e+01 10.750000  
                        3620) ShuckedWeight>=0.81275 13 1.523077e+01 10.461540 *
                        3621) ShuckedWeight< 0.81275 7 5.428571e+00 11.285710 *
                      1811) WholeWeight>=2.077 7 6.857143e+00 12.142860 *
                   453) Diameter>=0.5725 16 1.243750e+01 11.812500 *
                 227) LongestShell< 0.6975 32 1.775000e+02 12.125000  
                   454) Diameter< 0.5425 20 4.295000e+01 11.450000  
                     908) Type=F 10 1.290000e+01 10.900000 *
                     909) Type=M 10 2.400000e+01 12.000000 *
                   455) Diameter>=0.5425 12 1.102500e+02 13.250000 *
              57) ShuckedWeight< 0.70575 72 8.316528e+02 12.680560  
               114) WholeWeight< 1.71425 62 4.248548e+02 12.048390  
                 228) WholeWeight< 1.552 38 2.392632e+02 11.421050  
                   456) WholeWeight>=1.4285 31 1.201935e+02 10.838710  
                     912) LongestShell>=0.6475 20 3.655000e+01 10.350000  
                      1824) ShellWeight< 0.43775 12 1.425000e+01  9.750000 *
                      1825) ShellWeight>=0.43775 8 1.150000e+01 11.250000 *
                     913) LongestShell< 0.6475 11 7.018182e+01 11.727270 *
                   457) WholeWeight< 1.4285 7 6.200000e+01 14.000000 *
                 229) WholeWeight>=1.552 24 1.469583e+02 13.041670  
                   458) VisceraWeight< 0.3335 7 2.285714e+01 11.142860 *
                   459) VisceraWeight>=0.3335 17 8.847059e+01 13.823530 *
               115) WholeWeight>=1.71425 10 2.284000e+02 16.600000 *
            29) ShellWeight>=0.568 49 7.293469e+02 15.183670  
              58) ShuckedWeight>=0.77 27 2.376296e+02 13.296300  
               116) ShuckedWeight>=0.97525 13 4.369231e+01 12.153850 *
               117) ShuckedWeight< 0.97525 14 1.612143e+02 14.357140 *
              59) ShuckedWeight< 0.77 22 2.775000e+02 17.500000  
               118) LongestShell>=0.6925 14 1.248571e+02 16.285710 *
               119) LongestShell< 0.6925 8 9.587500e+01 19.625000 *
          15) ShuckedWeight< 0.589 98 1.365888e+03 15.663270  
            30) Diameter>=0.4925 71 7.417746e+02 14.943660  
              60) WholeWeight< 1.35025 33 2.381818e+02 13.545450  
               120) VisceraWeight>=0.25475 23 1.032174e+02 12.652170  
                 240) ShellWeight< 0.43875 13 2.876923e+01 11.692310 *
                 241) ShellWeight>=0.43875 10 4.690000e+01 13.900000 *
               121) VisceraWeight< 0.25475 10 7.440000e+01 15.600000 *
              61) WholeWeight>=1.35025 38 3.830526e+02 16.157890  
               122) Height< 0.1975 20 1.729500e+02 15.050000  
                 244) Height>=0.1825 11 3.563636e+01 13.818180 *
                 245) Height< 0.1825 9 1.002222e+02 16.555560 *
               123) Height>=0.1975 18 1.582778e+02 17.388890 *
            31) Diameter< 0.4925 27 4.906667e+02 17.555560  
              62) WholeWeight< 1.2975 19 3.684211e+02 16.631580 *
              63) WholeWeight>=1.2975 8 6.750000e+01 19.750000 *
# curva custo-complexidade (em função do n. splits)
plotcp(tree.cp4, upper = "splits",  minline = TRUE)
abline(v = 7, lty = "dashed", col = "red")

# curva custo-complexidade (em função de size)
plotcp(tree.cp4, upper = "size",  minline = TRUE)
abline(v = 7, lty = "dashed", col = "red")

7 Desvendando a árvore de regressão (para a árvore ajustada com parâmetros default)

7.1 A árvore sem divisões

Inicialmente, pode-se considerar que Rings (variável resposta y) pode ser explicado pela sua média. Então, utilizando-se dos valores reais de y do conjunto train (n = 3000) pode-se obter a média empírica e soma de erro quadrático (Sum of Squared Errors - SSE). O cálculo do SSE é dado pela soma da diferença entre os valores empíricos de Rings e a média aritmética de Rings. Assim, têm-se:

  • Média aritmética da variável resposta y no conjunto train = 9.941;
  • Score SSE no conjunto train = 33030.557.

Quando o modelo treinado tree é impresso verifica-se que os valores 9.941 e 33030.557 irão compor a raíz da árvore de regressão: (1) root n=3000 SSE=33030.5600 Mean=9.941000. No nó raiz estão 100% dos dados do conjunto train.

setDT(train)
hatTrain <- train[,c("Rings", "ShellWeight", "ShuckedWeight")]                # seleciona colunas
hatTrain[, `:=` (MeanObs = mean(Rings))][]                                    # média aritmética e empilha
hatTrain[, `:=` (SSE = sum((Rings - MeanObs)^2))][]                           # SSE
hatTrain[, `:=` (N=.N)][]                                                     # número de observações
hatTrain[, `:=` (MSE = sum((Rings - MeanObs)^2)/length(Rings))][]             # MSE
hatTrain[, `:=` (R2 = 1-(sum((Rings-MeanObs)^2)/sum((Rings-mean(Rings))^2)))] # R-squared
hatTrain[, `:=` (RelError = 1-R2)]                                            # Relative Error

7.2 A primeira decisão de partição da árvore de regressão

A partir do modelo de árvore gerado pode-se observar que apenas duas variáveis foram utilizadas pelo CART para produzir a árvore de regressão: ShellWeighte ShuckedWeight. A primeira decisão de partição do algoritmo foi: 2) ShellWeight< 0.19475 n=1248 SSE=6526.1660 Mean=7.853365. Assim, a primeira partição dividiu as 3000 observações em grupos de 1248 (42%) e 1752 (58%) (nós 2 e 3) com valores médios de Rings de 7.853365 e 11.428080, respectivamente. Tendo por base essa primeira partição (ShellWeight < 0.19475 e ShellWeight \(\geq\) 0.19475) pode-se avaliar novamente o score SSE considerando-se a média aritmética dos valores empiricos de Rings em cada partição.

Fazendo cálculos simples podemos ratificar os percentuais apresentados nos dois nós folhas iniciais da árvore de regressão:

with(train,table(ShellWeight<0.19475))        # tabela freq. p/ variável Class ShellWeight<0.19475

FALSE  TRUE 
 1752  1248 
with(train,prop.table(table(ShellWeight<0.19475))*100)

FALSE  TRUE 
 58.4  41.6 

Então, pode-se calcular as novas médias aritméticas e SSEs para a primeira partição proposta. Os resultados devem corresponder ao observado em:

2) ShellWeight< 0.19475 n=1248 SSE=6526.1660 Mean=7.853365; e

3) ShellWeight>=0.19475 n=1752 SSE=17190.9400 mean=11.428080.


hatTrain$split.1 <- "Part.1"
hatTrain$split.1[hatTrain$ShellWeight >= tree$splits[1,4]] <- "Part.2"
hatTrain[, `:=` (Mean.1 = mean(Rings)), by="split.1"]                                        # média aritmética por partição e empilha
setorder(hatTrain, split.1)                                                                  # ordenando com base em "binary.1"
hatTrain[, `:=` (SSE.1 = sum((Rings - Mean.1)^2)), by="split.1"][]                           # SSE
hatTrain[, `:=` (N.1=.N), by="split.1"][]                                                    # número de observações por partição
hatTrain[, `:=` (MSE.1 = sum((Rings - Mean.1)^2)/length(Rings)),by="split.1"][]              # MSE
hatTrain[, `:=` (CP.1 = 1 - sum(unique(SSE.1))/unique(SSE))][]                               # CP
hatTrain[, `:=` (R2.1 = 1-(sum((Rings-Mean.1)^2)/sum((Rings-mean(Rings))^2)))]               # R-squared

#1-(SSE.part1 + SSE.part2)/SST                                                        
#hatTrain[, `:=` (SE.2= sum((Rings - Mean.2)^2))][]                 # SSE total primeira partição  
#with(hatTrain,table(Particao.1))

Para melhor compreensão pode-se fazer um scatterplot das duas variáveis utilizadas (ShellWeighte ShuckedWeight) pelo algoritmo para estabelecer as partições:


p <- ggplot() + theme_stata()
(p <- p + geom_point(data=hatTrain, aes(x=ShellWeight, y=ShuckedWeight)))

Aqui, podemos visualizar a primeira partição proposta pelo algoritmo:


p <- ggplot() + theme_stata()
p <- p + geom_point(data=hatTrain, aes(x=ShellWeight, y=ShuckedWeight))
p <- p + geom_vline(xintercept=tree$splits[1,4], colour="red", linetype="dotted")
p <- p + geom_text(aes(x=tree$splits[1,4], y=1.3, label="SheW < 0.19475"), 
            colour="red", angle=90, vjust = 1.2, text=element_text(size=7))
Warning: Ignoring unknown parameters: text
(p <- p + geom_point(data=hatTrain, aes(x=ShellWeight, y=ShuckedWeight, colour=split.1)) + 
    scale_colour_manual(values = c("black", "red")) + theme(legend.position="none"))

7.2.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1

  • Um nova partição

Inicialmente, como já sabe-se á arvore foi dividida em duas parte: ShellWeight< 0.19475 e e ShellWeight \(\geq\) 0.19475. Assim, vamos considerar as partições do lado esquerdo da árvore. Fazendo-se isso, a próxima partição será: 4) ShellWeight< 0.06775 333 874.7988 5.939940*, que indicará um nó terminal. Caso contrário (ShellWeight \(\geq\) 0.06775) uma nova partição foi realizada. Assim, o conjunto de dados foi dividido em duas parte tendo por base ShellWeight < 0.06775, onde 11% (n=333) dos dados tiveram valores < 0.06775 para a variável ShellWeight, e os demais 31% (n=915) tiveram valores superiores. Tendo por base essa nova partição (ShellWeight < 0.06775 e ShellWeight \(\geq\) 0.06775) pode-se avaliar novamente o score SSE considerando-se a média aritmética dos valores empiricos de y em cada partição.

Fazendo cálculos simples podemos ratificar os percentuais apresentados nos dois nós folhas iniciais da árvore de regressão:

with(hatTrain[ which(ShellWeight<0.19475),],table(ShellWeight<0.06775))   # tabela freq. p/ variável Class ShellWeight<0.06775

FALSE  TRUE 
  915   333 

Então, pode-se calcular as novas médias aritméticas e SSEs para a primeira partição proposta. Os resultados devem corresponder ao observado em:

4) ShellWeight< 0.06775 333 874.7988 5.939940 *; e

5) ShellWeight>=0.06775 915 3988.4870 8.549727.


hatTrain$split.2 <- NA

hatTrain$split.2[hatTrain$ShellWeight < 0.19475 & hatTrain$ShellWeight < 0.06775] <- "Part.3"
hatTrain$split.2[hatTrain$ShellWeight < 0.19475 & hatTrain$ShellWeight >= 0.06775] <- "Part.4"
hatTrain$split.2[hatTrain$ShellWeight > 0.19475 & hatTrain$ShellWeight < 0.4095] <- "Part.5"
hatTrain$split.2[hatTrain$ShellWeight > 0.19475 & hatTrain$ShellWeight >= 0.4095] <- "Part.6"

hatTrain[, `:=` (Mean.3 = mean(Rings)), by="split.2"]              # média aritmética por partição e empilha
setorder(hatTrain, split.2)                                        # ordenando com base em "binary.1"
hatTrain[, `:=` (SSE.3 = sum((Rings - Mean.3)^2)), by="split.2"][] # SSE
#with(hatTrain,table(split.2))

Podemos visualizar as novas partições propostas pelo algoritmo:


p <- ggplot() + theme_stata()
p <- p + geom_point(data=hatTrain, aes(x=ShellWeight, y=ShuckedWeight, colour=split.2)) +
  scale_colour_manual(values = c("black", "red", "blue", "green")) + theme(legend.position="none")
p <- p + geom_vline(xintercept=0.19475, colour="red", linetype="dotted")
p <- p + geom_vline(xintercept=0.06775, colour="black", linetype="dotted")
p <- p + geom_vline(xintercept=0.4095, colour="blue", linetype="dotted")
p <- p + geom_text(aes(x=0.19475, y=1.3, label="SheW = 0.19475"), 
            colour="red", angle=90, vjust = 1.2, text=element_text(size=7))
Warning: Ignoring unknown parameters: text
p <- p + geom_text(aes(x=0.06775, y=1.3, label="SheW = 0.06775"), 
            colour="black", angle=90, vjust = 1.2, text=element_text(size=7))
Warning: Ignoring unknown parameters: text
p <- p + geom_text(aes(x=0.4095, y=1.3, label="SheW = 0.4095"), 
            colour="blue", angle=90, vjust = 1.2, text=element_text(size=7))
Warning: Ignoring unknown parameters: text
p